//封装工具类  目的：将配置文件与axios进行了一个简单的结合
import axios from "axios";
import config from '../config/index'
import router from "../src/route/index";
import store from "../src/store/index";
// const instance = axios.create({
//     baseURL:'http://localhost:8080'
// })
// export default instance
//拿到请求的接口地址
// const baseUrl = process.env.NODE_DEV === 'development' ? config.baseUrl.dev : config.baseUrl.pro//判断当前环境
const baseUrl = 'http://localhost:8080'
console.log(baseUrl);
class HttpRequest{
    constructor (baseUrl) {//初始化
        this.baseUrl = baseUrl
    }
    getInsideConfig() {//定义axios相关配置
        const config = {
            // 定义初始值
            baseUrl: this.baseUrl,
            header: {}
        }
        console.log(baseUrl);
        return config
    }

    interceptors (instance) {//拦截器，instance是axios的一个实例
        // 添加请求拦截器,若token存在则在请求头中加token，不存在也继续请求
        instance.interceptors.request.use(
            function (config) {
                console.log(store.state.store.token);
                if(store.state.store.token){  // 每次发送请求之前检测都vuex存有token,那么都要放在请求头发送给服务器,没有则不带token
                    console.log('已进入配置headers');
                    config.headers = {
                        'Authorization' : store.state.store.token // Authorization是必须的
                    }
                }
                return config;
            }, 
            function (error) {  //请求错误
                console.log("在request拦截器显示错误", error.response);
                return Promise.reject(error);
            }
        );

        // 添加响应拦截器
        instance.interceptors.response.use(
            //响应成功
            function (response) {
                console.log(response,'response');
                return response.data.code === 200 ? response:Promise.reject(response.data.message);//在status正确的情况下，code不正确则返回对应的错误信息
            }, 
            //响应错误
            function (error) {
                console.log(error,'error');
                if(error.response){ //在status不正确的情况下，判别status状态码给出对应响应
                    console.log("在response拦截器显示错误",error.response)
                    switch (error.response.status){
                        case 403: //token过期
                            // store.commit("delToken")
                            router.replace({
                                path:'/login',
                                query:{ redirect: router.currentRoute.fullPath }//将跳转的路由path作为参数，登录成功后跳转到该路由
                            })
                    }
                }
                // return Promise.reject(error);
                return Promise.reject(error.response.data)
            }
        );
    }


    request(options) {//在进行后续接口请求的时候就是调这个函数
        const instance = axios.create()//创建axios实例
        options = { ...this.getInsideConfig(), ...options}//把return的配置解构出来，接收传入的相关配置
        this.interceptors(instance)//调用拦截器，将创建的axios实例传进去
        return instance(options)//拿到axios实例，传入数据，返回接口请求的结果
    }
}

export default new HttpRequest(baseUrl)
